PIC Tutorial Six - I2C EEPROM Programming
These tutorials require the Main Board, the LCD Board,
and various of the I2C Boards, as written the tutorials use the LCD Board
on PortA and the I2C Boards on PortB - although these could easily be
swapped over, as the I2C Boards don't use either of the two 'difficult'
pins for PortA, pins 4 and 5, as outputs. Download
zipped tutorial files.
As with the LCD Tutorial, the idea is to implement a
reusable set of I2C routines.
Rather than showing the routines on the page as with
earlier tutorials (they are getting quite lengthy now), I'm only going to
store them in the pages download ZIP
file so you will need to download them. As the I2C tutorials use a
number of different boards, each section is headed by the I2C boards
required in bold type.
I2C is a protocol designed by Philips Semiconductors,
and is for communications between I/C's over a two wire synchronous serial
bus, devices are classed as either 'Master' or 'Slave', for our purposes
the Main Board processor is the 'Master', and any other devices are
'Slaves'. The initial tutorials use a 24C04, a 512 byte EEPROM memory
chip, commonly used for storing the settings in modern TV's and VCR's,
where they are used to store all the customer settings (tuning, volume,
brightness etc.) and the internal calibration values for the set, which
are normally accessed through a special 'service mode'. These chips
provide non-volatile memory as a series of 256 byte 'pages', so the 24C04
provides two 'pages' giving 512 bytes of memory. The 24C02 uses 'standard
addressing', which gives the 256 byte page limit, other larger chips use
'extended addressing', giving a possible 16 bit address space, I've used a
24C256 which uses a 15 bit address space, giving 32,768 of memory space.
To address these you require two bytes of address data, the programs
already include these (but commented out), I've uncommented them for
copies of the first two tutorials and called them 6_1a and 6_2a, if you
want to use an EEPROM larger than a 24C16 you will need to use these
extended addressing versions.
I2C EEPROM Board The first tutorial writes sequential numbers through one
entire page of memory, and then reads them back, 4 bytes at a time,
displaying them on the LCD, separated by about half a second between
updates. The second tutorial demonstrates 'sequential writing', the first
tutorial uses 'byte writing' (which is why it displays 'Writing..' for a
couple of seconds) - a write is fairly slow to EEPROM, taking around 10mS
to complete - 'sequential writing' allows you to store a number of bytes
in RAM inside the EEPROM chip (a maximum of 8 for the 24C04) and then
write them all to EEPROM with a single write delay. Tutorial 2 writes 4
bytes at once, to demonstrate how this is done. The third tutorial is
simply a cut-down version of the first, I've included it as a useful tool,
it simply reads one page of the EEPROM and displays it as tutorial 1 does
- useful for checking the contents of an EEPROM. You can deal with the
EEPROM write delay in a couple of ways, firstly you can introduce a
software delay, and this option is included in the tutorials (but
commented out), or you can keep checking until the chip is ready, this is
the method I've used in these tutorials, although if you want you can
comment that line out and un-comment the 'call delay10' line instead.
I2C Clock Board, and I2C Switch Board Now we move onto the I2C Clock board, basically we use
exactly the same I2C routines, the only difference being in the way we
manipulate the data, we need to read the clock registers from the chip
(using a sequential read), apply a little processing, and then display
them on the LCD. Actually setting the clock is somewhat more complicated,
and the biggest difference is the routines for reading the switch board,
and setting the clock chip values - which are then written back to the
chip with a sequential write. The four buttons used are (from left to
right), 'Set', 'Up', 'Down', and 'Next' - in the initial display mode the
only button which has an effect is the 'Set' button, this jumps to the
'Clock Set' mode, and starts a flashing cursor on the tens of hours. From
this point all four buttons work, pressing 'Set' again will return to
display mode, updating the clock values (and zeroing the seconds).
Pressing 'Up' will increase the value under the cursor, and 'Down' will
decrease the value, with '0' being the lower limit, and '9' being the
upper one - I don't currently take account of the different maximum values
for particular digits (i.e. tens of hours doesn't go higher than 2), but
rely on setting them sensibly. The 'Next' button moves on to the next
digit, and if pressed while on the last digit (years units) will return to
display mode, just like pressing the 'Set' button. I also don't currently
take any account of the correct years, the PCF8583 only provides 0-3 for
the years, with 0 being a leap year - extra software routines will be
required to do this, with the actual values stored in spare PCF8583 EEPROM
memory, and updated when the year changes (remembering that the year might
change while the processor is powered down, and the clock is running on
it's back-up battery).
I2C A2D Board, and I2C Switch Board Again, the A2D board uses the same basic I2C routines as
before (but with a different chip address for the PCF8591) as with the I2C
Clock Board the differences come in the manipulation of the data. As the
board also includes an EEPROM socket this can be used to store samples
from the A2D chip - with a single 24C256 we can store up to 32,768 eight
bit samples - this introduces a slight 'snag', the 24C256 uses 'extended
addressing', while the PCF8591 only uses 'standard addressing', however we
can still use the same I2C routines by using a flag to tell the routines
which addressing mode to use, simply switching the flag for the different
chips - this flag switching becomes part of the reusable I2C routines.
|